package com.estagio.bean;

import java.util.ArrayList;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;

import org.primefaces.context.RequestContext;

import com.estagio.entity.CondicaoPagamento;
import com.estagio.entity.Modalidade;
import com.estagio.entity.Periodo;
import com.estagio.entity.Plano;
import com.estagio.entity.PlanoModalidade;
import com.estagio.session.CondicaoPagamentoSession;
import com.estagio.session.ModalidadeSession;
import com.estagio.session.PeriodoSession;
import com.estagio.session.PlanoModalidadeSession;
import com.estagio.session.PlanoSession;

@ManagedBean(name="planoBean")
@SessionScoped
public class PlanoBean {
	
	//PLANO
	private Plano plano = new Plano();
	private Plano planoSave = new Plano();
	private Plano planoSelecionado;
	private String mensagem;
	private DataModel dmPlano;
	private Double somaValorTotal;
	
	//PERIODO
	private Periodo periodo = new Periodo();
	private Periodo periodoSelecionado = new Periodo();
	private Periodo periodoPlano = new Periodo();
	private DataModel dmPeriodo;	
	
	//MODALIDADE
	private Modalidade modalidade = new Modalidade();
	private Modalidade modalidadeSave = new Modalidade();
	private DataModel dmModalidade;
	private Modalidade modalidadeSelecionada = new Modalidade();
	
	//PLANO/MODALIDADE
	private PlanoModalidade planoModalidade = new PlanoModalidade();
	private PlanoModalidade planoModalidadeSelect = new PlanoModalidade();
	private DataModel dmPlanoModalidade;
	private List<PlanoModalidade> arrayPlanoModalidade;
	
	//CONDICAO DE PAGAMENTO
	private CondicaoPagamento condicaoPagamento = new CondicaoPagamento();
	private DataModel dmCondicaoPagamento;
	private List<CondicaoPagamento> arrayCondicaoPagamento;

	
	public PlanoBean() {
		this.plano.setPeriodo(new Periodo());
		this.periodoPlano = new Periodo();
	}


	//GETTERS AND SETTERS	
	
	public String getMensagem() {
		return mensagem;
	}


	public void setMensagem(String mensagem) {
		this.mensagem = mensagem;
	}
		
	public void setArrayCondicaoPagamento(
			List<CondicaoPagamento> arrayCondicaoPagamento) {
			this.arrayCondicaoPagamento = arrayCondicaoPagamento;
		}

	public CondicaoPagamento getCondicaoPagamento() {
		return condicaoPagamento;
	}


	public void setCondicaoPagamento(CondicaoPagamento condicaoPagamento) {
		this.condicaoPagamento = condicaoPagamento;
	}


	public DataModel getDmCondicaoPagamento() {
		return dmCondicaoPagamento;
	}


	public void setDmCondicaoPagamento(DataModel dmCondicaoPagamento) {
		this.dmCondicaoPagamento = dmCondicaoPagamento;
	}


	public List<CondicaoPagamento> getArrayCondicaoPagamento() {
		return arrayCondicaoPagamento;
	}
	public Plano getPlanoSave() {
		return planoSave;
	}

	public PlanoModalidade getPlanoModalidadeSelect() {
		return planoModalidadeSelect;
	}


	public void setPlanoModalidadeSelect(PlanoModalidade planoModalidadeSelect) {
		this.planoModalidadeSelect = planoModalidadeSelect;
	}


	public PlanoModalidade getPlanoModalidade() {
		return planoModalidade;
	}


	public List<PlanoModalidade> getArrayPlanoModalidade() {
		return arrayPlanoModalidade;
	}


	public void setArrayPlanoModalidade(List<PlanoModalidade> arrayPlanoModalidade) {
		this.arrayPlanoModalidade = arrayPlanoModalidade;
	}


	public void setPlanoModalidade(PlanoModalidade planoModalidade) {
		this.planoModalidade = planoModalidade;
	}


	public DataModel getDmPlanoModalidade() {
		return dmPlanoModalidade;
	}


	public void setDmPlanoModalidade(DataModel dmPlanoModalidade) {
		this.dmPlanoModalidade = dmPlanoModalidade;
	}


	public Modalidade getModalidadeSelecionada() {
		return modalidadeSelecionada;
	}


	public void setModalidadeSelecionada(Modalidade modalidadeSelecionada) {
		this.modalidadeSelecionada = modalidadeSelecionada;
	}


	public Modalidade getModalidade() {
		return modalidade;
	}

	public void setModalidade(Modalidade modalidade) {
		this.modalidade = modalidade;
	}	

	public Modalidade getModalidadeSave() {
		return modalidadeSave;
	}

	public void setModalidadeSave(Modalidade modalidadeSave) {
		this.modalidadeSave = modalidadeSave;
	}


	public DataModel getDmModalidade() {
		return dmModalidade;
	}


	public void setDmModalidade(DataModel dmModalidade) {
		this.dmModalidade = dmModalidade;
	}


	public void setPlanoSave(Plano planoSave) {
		this.planoSave = planoSave;
	}

	public Periodo getPeriodoPlano() {
		return periodoPlano;
	}

	public void setPeriodoPlano(Periodo periodoPlano) {
		this.periodoPlano = periodoPlano;
	}

	public Periodo getPeriodoSelecionado() {
		return periodoSelecionado;
	}

	public void setPeriodoSelecionado(Periodo periodoSelecionado) {
		this.periodoSelecionado = periodoSelecionado;
	}

	public Periodo getPeriodo() {
		return periodo;
	}

	public void setPeriodo(Periodo periodo) {
		this.periodo = periodo;
	}
	
	public Plano getPlano() {
		return plano;
	}

	public void setPlano(Plano plano) {
		this.plano = plano;
	}

	public Plano getPlanoSelecionado() {
		return planoSelecionado;
	}

	public void setPlanoSelecionado(Plano planoSelecionado) {
		this.planoSelecionado = planoSelecionado;
	}

	public DataModel getDmPlano() {
		return dmPlano;
	}


	public void setDmPlano(DataModel dmPlano) {
		this.dmPlano = dmPlano;
	}


	public DataModel getDmPeriodo() {
		return dmPeriodo;
	}


	public void setDmPeriodo(DataModel dmPeriodo) {
		this.dmPeriodo = dmPeriodo;
	}

	//METODOS PLANO

	public void savePlano() {
		PlanoSession session = new PlanoSession();
		String mensagem = session.save(this.plano, this.arrayPlanoModalidade);
		FacesMessage faces = new FacesMessage(this.mensagem);
		FacesContext contexto = FacesContext.getCurrentInstance();
		contexto.addMessage(null, faces);		
		RequestContext.getCurrentInstance().update("panelManterPlano");
		RequestContext.getCurrentInstance().update("growl");
//		this.savePlanoModalidade();
	}

//	public void savePlanoModalidade() {
//		PlanoModalidadeSession session = new PlanoModalidadeSession();
//		String mensagem = session.save(this.arrayPlanoModalidade);
//		FacesMessage faces = new FacesMessage(this.mensagem);
//		FacesContext contexto = FacesContext.getCurrentInstance();
//		contexto.addMessage(null, faces);		
//		RequestContext.getCurrentInstance().update("panelManterPlano");
//		RequestContext.getCurrentInstance().update("growl");
//	}
	
	public String deletePlano() {
		PlanoSession planoRN = new PlanoSession();		
		Plano plano = this.planoSave;
		this.mensagem = planoRN.delete(plano);
		this.planoSave = new Plano();
		FacesMessage faces = new FacesMessage(mensagem);
		FacesContext contexto = FacesContext.getCurrentInstance();
		contexto.addMessage(null, faces);
		return "consultarPlano";
	}

	public DataModel findPlano() {
		PlanoSession planoSession = new PlanoSession();
		List<Plano> lista = planoSession.find(this.plano, null);
//		System.out.println("array no find planoBean: " + lista.size());
		this.dmPlano = new ListDataModel(lista);
		return this.dmPlano;
	}
	
	public void clean() {
		this.plano = new Plano();
	}
	

	//PERIODO
	public void savePeriodo() {
		PeriodoSession periodoSession = new PeriodoSession();
		Periodo periodo = this.periodo;		
		this.mensagem = periodoSession.save(periodo);
		
		FacesMessage faces = new FacesMessage(this.mensagem);
		FacesContext contexto = FacesContext.getCurrentInstance();
		contexto.addMessage(null, faces);		
	}

	public String deletePeriodo() {
		PeriodoSession periodoRN = new PeriodoSession();		
		Periodo periodo = this.periodoSelecionado;
		this.mensagem = periodoRN.delete(periodo);
		this.periodoSelecionado = new Periodo();
		FacesMessage faces = new FacesMessage(mensagem);
		FacesContext contexto = FacesContext.getCurrentInstance();
		contexto.addMessage(null, faces);
		return "consultarPeriodo";
	}

	public DataModel findPeriodo() {
		RequestContext.getCurrentInstance().update("panelDialogConsultarPeriodo");		
		
		List<Periodo> listaPeriodo = new PeriodoSession().find(this.periodo);
		this.dmPeriodo = new ListDataModel(listaPeriodo);
		return this.dmPeriodo;
	}

	public void selectPeriodo() {
		Periodo periodo = (Periodo) this.dmPeriodo.getRowData();
		this.plano.setPeriodo(periodo);
		
		RequestContext.getCurrentInstance().update("pgPeriodo");
		RequestContext.getCurrentInstance().execute("dialogConsultarPeriodo.hide()");
	}
	
	//DIALOG MODALIDADE
	public DataModel findModalidade() {
		List<Modalidade> listaModalidade = new ModalidadeSession().find(this.modalidade);
		this.dmModalidade = new ListDataModel(listaModalidade);
		return this.dmModalidade;
	}
	
	public void addModalidade() {
		PlanoModalidadeSession session = new PlanoModalidadeSession();
		String mensagem = session.addModalidade(this.arrayPlanoModalidade, this.planoModalidade);
		
		if(mensagem.equals("")) {
			this.arrayPlanoModalidade.add(this.planoModalidade);
			this.somaValorTotal = this.somaValorTotal + this.planoModalidade.getValor();			
			this.plano.setTotal(this.somaValorTotal);
			this.planoModalidade = new PlanoModalidade();
			this.planoModalidade.setModalidade(new Modalidade());
			RequestContext.getCurrentInstance().update("pgPlanoModalidade");
			RequestContext.getCurrentInstance().update("tablePlanoModalidade");
		} else {
			FacesMessage faces = new FacesMessage(mensagem);
			FacesContext contexto = FacesContext.getCurrentInstance();
			contexto.addMessage(null, faces);
			RequestContext.getCurrentInstance().update("growl");
		}
		
		
		
	}
	
	public void selectModalidade() {
		Modalidade modalidade = (Modalidade) this.dmModalidade.getRowData();
		this.planoModalidade.setModalidade(modalidade);
		this.planoModalidade.setValor(modalidade.getValor());		
		RequestContext.getCurrentInstance().update("pgPlanoModalidade");
		RequestContext.getCurrentInstance().execute("dialogConsultarModalidade.hide()");
	}
	
	//CONDICAO DE PAGAMENTO
	public DataModel findCondicaoPagamento() {
		List<CondicaoPagamento> listaCondicaoPagamento = new CondicaoPagamentoSession().find(this.condicaoPagamento);
		this.dmCondicaoPagamento = new ListDataModel(listaCondicaoPagamento);
		return this.dmCondicaoPagamento;
	}

	public void selectCondicaoPagamento() {
		CondicaoPagamento condicaoPagamento = (CondicaoPagamento) this.dmCondicaoPagamento.getRowData();
		this.plano.setCondicaoPagamento(condicaoPagamento);
		RequestContext.getCurrentInstance().update("pgCondicaoPagamento");
		RequestContext.getCurrentInstance().execute("dialogConsultarCondicaoPagamento.hide()");
	}
	

	
	//INVOCAR TELAS
	public String newPlano() {
		this.plano = new Plano();
		this.plano.setPeriodo(new Periodo());
		this.plano.setCondicaoPagamento(new CondicaoPagamento());
		this.planoModalidade = new PlanoModalidade();
		this.planoModalidade.setModalidade(new Modalidade());
		this.planoModalidade.setPlano(new Plano());
		this.arrayPlanoModalidade = new ArrayList<PlanoModalidade>();
		this.arrayCondicaoPagamento = new ArrayList<CondicaoPagamento>();
		this.condicaoPagamento = new CondicaoPagamento();
		this.somaValorTotal = 0.00;
		return "manterPlano";
	}

	public String consultarPlano() {
		return "consultarPlano";
	}

	public String editarPlano() {
		this.planoSave = (Plano) this.dmPlano.getRowData();		
		return "editarPlano";
	}
	
	public String excluirPlano() {
		this.planoSave = (Plano) this.dmPlano.getRowData();
		return "excluirPlano";
	}
	
	//DIALOGS
	public void openDialogConsultarPlano() {
		RequestContext.getCurrentInstance().update("idDialogConsultarPlano");
		RequestContext.getCurrentInstance().execute("dialogConsultarPlano.show()");
	}
	
	public void openDialogConsultarCondicaoPagamento() {
		RequestContext.getCurrentInstance().update("idDialogConsultarCondicaoPagamento");
		RequestContext.getCurrentInstance().execute("dialogConsultarCondicaoPagamento.show()");
	}
	
	public void openDialogManterPlano() {
		this.planoSave = new Plano();
		RequestContext.getCurrentInstance().update("idDialogManterPlano");
		RequestContext.getCurrentInstance().execute("dialogManterPlano.show()");
	}

	public void openDialogConsultarPeriodo() {
		RequestContext.getCurrentInstance().update("idDialogConsultarPeriodo");
		RequestContext.getCurrentInstance().execute("dialogConsultarPeriodo.show()");
	}
	
	public void openDialogAddAulas() {
		this.planoModalidade.setModalidade(new Modalidade());
		this.planoModalidade.setPlano(new Plano());
		RequestContext.getCurrentInstance().update("idDialogAddAula");
		RequestContext.getCurrentInstance().execute("dialogAddAula.show()");
	}
	
	public void openDialogConsultarModalidade() {
		RequestContext.getCurrentInstance().update("idDialogConsultarModalidade");
		RequestContext.getCurrentInstance().execute("dialogConsultarModalidade.show()");
	}
	
}
